
#include "portmacro.h"
#include "task.h"

#define TASK1_STACK_SIZE 128
static StackType_t Task1Stack[TASK1_STACK_SIZE];

#define TASK2_STACK_SIZE 128
static StackType_t Task2Stack[TASK2_STACK_SIZE];

#define TASK3_STACK_SIZE 128
static StackType_t Task3Stack[TASK3_STACK_SIZE];

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

static void Task1_Entry(void);
static void Task2_Entry(void);
static void Task3_Entry(void);

static void delay(uint32_t cnt)
{
	while(cnt--);
}

static void Task1_Entry(void)
{
	for ( ; ; )
	{
		flag1 = 1;
		// vTaskDelay(10);
		delay(100);
		flag1 = 0;
		// vTaskDelay(10);
		delay(100);
	}
}

static void Task2_Entry(void)
{
	for ( ; ; )
	{
		flag2 = 1;
		// vTaskDelay(10);
		delay(100);
		flag2 = 0;
		// vTaskDelay(10);
		delay(100);
	}
}

static void Task3_Entry(void)
{
	for ( ; ; )
	{
		flag3 = 1;
		vTaskDelay(1);
		flag3 = 0;
		vTaskDelay(1);
	}
}

// 定义任务控制块
TCB_t Task1TCB;
TCB_t Task2TCB;
TCB_t Task3TCB;


int main(void)
{
	TaskHandle_t Task1_Handle;
	TaskHandle_t Task2_Handle;
	TaskHandle_t Task3_Handle;

	// 创建任务 1
 	Task1_Handle = xTaskCreateStatic((TaskFunction_t)Task1_Entry, 	/* 任务入口 */
									(char *)"Task1", 				/* 任务名称，字符串形式 */
									(uint32_t)TASK1_STACK_SIZE , 	/* 任务栈大小，单位为字 */
									(void *) NULL, 					/* 任务形参 */
									(UBaseType_t)2,					/* 任务优先级，数值越大，优先级越高 */
									(StackType_t *)Task1Stack, 		/* 任务栈起始地址 */
									(TCB_t *)&Task1TCB); 			/* 任务控制块 */

	// 创建任务 2
	Task2_Handle = xTaskCreateStatic((TaskFunction_t)Task2_Entry, 	/* 任务入口 */
									(char *)"Task2", 				/* 任务名称，字符串形式 */
									(uint32_t)TASK2_STACK_SIZE , 	/* 任务栈大小，单位为字 */
									(void *) NULL, 					/* 任务形参 */
									(UBaseType_t)2,					/* 任务优先级，数值越大，优先级越高 */
									(StackType_t *)Task2Stack, 		/* 任务栈起始地址 */
									(TCB_t *)&Task2TCB); 			/* 任务控制块 */

	// 创建任务 3
	Task3_Handle = xTaskCreateStatic((TaskFunction_t)Task3_Entry, 	/* 任务入口 */
									(char *)"Task3", 				/* 任务名称，字符串形式 */
									(uint32_t)TASK3_STACK_SIZE , 	/* 任务栈大小，单位为字 */
									(void *) NULL, 					/* 任务形参 */
									(UBaseType_t)3,					/* 任务优先级，数值越大，优先级越高 */
									(StackType_t *)Task3Stack, 		/* 任务栈起始地址 */
									(TCB_t *)&Task3TCB); 			/* 任务控制块 */
	
	vTaskStartScheduler();	// 启动任务调度

	while(1); // 程序不会运行到这
	
	return 0;
}

